home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / lollipop / fonts.tex (.txt) < prev    next >
LaTeX Document  |  1993-01-28  |  15KB  |  376 lines

  1. % Fonts.tex copyright 1992/3 Victor Eijkhout
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%% Font selection macros %%%%%%%%%%%
  4. %%%% Text Fonts
  5. \NewTrace:font
  6. % User commands to change the three parameters
  7. % \Typeface:FACE
  8. %     \F@name <-- FACE
  9. \def\Typeface:#1
  10.    {\if\UndefinedCS{#1@code}\Wmessage{Undefined typeface: `#1'}\fi
  11.     \def\F@name{#1}}
  12. \let\TypeFace\Typeface
  13. % \Pointsize:NN
  14. %     \F@size <-- NN
  15. %     compute script/sscript sizes
  16. %     if necessary install math fonts
  17. \def\PointSize:#1 {\tempcounta=\@ww{#1}%
  18.     \edef\F@size{\the\tempcounta}%this line is used in \set@mathfont
  19.     \xp\@setsizes\xp{\F@size}%
  20.     \xp\pointsize@baselineskip\xp{\F@size}}
  21. \let\Pointsize=\PointSize
  22. % \Style:STYLE
  23. %     \F@style <-- STYLE
  24. %     load actual font
  25. %     put font in \textfont0
  26. %     install value of \@space
  27. \def\Style:#1 {\def\F@style{#1}%
  28.     \ifmmode\SetFamily\else\SetFont\fi}
  29. \def\ifStyle:#1 {\xp\if\xp\EqualStringX\xp{\F@style}{#1}}
  30. % and together this makes:
  31. \def\current@font{\F@name\F@style\romannumeral\F@size}
  32. % abbreviations for common styles
  33. \def\italic{\Style:italic }\def\roman{\Style:roman }
  34. \def\bold{\Style:bold }\def\tty{\Style:tty }
  35. \let\rm=\roman \let\bf=\bold \let\it=\italic \let\sl=\italic
  36. % Command for actual loading is also user command.
  37. % If this is in a style definition, fill the math families.
  38. \def\SetFont{\maybe@load@font
  39.     \if@started\else\store@main@font\fi
  40.     \ifx\cs@a\relax %error condition if load not succeeded
  41.     \else \csname\cs@a\endcsname
  42.           \@@space=.5em\relax
  43.     \fi}
  44. \def\maybe@load@font{\edef\cs@a{\current@font}%
  45.     \if\UndefinedCS{\cs@a}\load@font\fi}
  46. \def\load@font{\def@f@ext@name
  47.     \Tmessage[font]{Loading font (text): \cs@a=`\f@ext@name'}%
  48.     \edef\cs@e{\global\font\CSname{\cs@a}=\f@ext@name\relax}\cs@e
  49.     }
  50. \def\def@f@ext@name
  51.    {\edef\f@ext@name{\ext@combo}%
  52.     \edef\f@ext@name{\ext@name
  53.          \ifx\f@ext@name\@empty \ext@style\ext@size
  54.          \else \f@ext@name \fi}}
  55. \def\face@tag{\F@name @code}
  56. \def\cs@face@tag{\csname\face@tag\endcsname}
  57. % Find relative sizes of the current size
  58. % and install math fonts
  59. \def\@ps@rls#1{ps@rls\romannumeral#1}
  60. \def\PointSizeScriptSizes:#1=#2,#3,#4 
  61.    {\csarg\def{\@ps@rls#1}{{#2}{#3}{#4}}}
  62. \def\@setsizes#1{\if\UndefinedCS{\@ps@rls{#1}}\tempcounta#1\relax
  63.         \tempcountb\tempcounta \multiply\tempcountb7 \divide\tempcountb10
  64.         \tempcountc\tempcounta \divide\tempcountc2
  65.         \edef\@@setsizes
  66.            {{\the\tempcounta}{\the\tempcountb}{\the\tempcountc}}%
  67.     \else
  68.         \edef\@@setsizes{\csname\@ps@rls{#1}\endcsname}%
  69.     \fi
  70.     \expandafter\@setsize\@@setsizes}
  71. \PointSizeScriptSizes:0=0,0,0
  72. \PointSizeScriptSizes:1=1,1,1
  73. \PointSizeScriptSizes:2=2,2,2
  74. \PointSizeScriptSizes:3=2,3,3
  75. \PointSizeScriptSizes:4=4,4,4
  76. \PointSizeScriptSizes:5=5,5,5
  77. \PointSizeScriptSizes:6=6,5,5
  78. \PointSizeScriptSizes:7=7,6,5
  79. \PointSizeScriptSizes:8=8,6,5
  80. \PointSizeScriptSizes:9=9,7,5
  81. \PointSizeScriptSizes:10=10,7,5
  82. \PointSizeScriptSizes:11=11,8,6
  83. % Fill in a math font family corresponding to the
  84. % surrounding size
  85. \def\SetFamily{\ifface@size@changed\begingroup
  86. %\tracingmacros=2 \tracingcommands\tracingmacros
  87.     \edef\tmp@sizes{\csname\@ps@rls{\F@size}\endcsname}
  88.     \edef\F@size{\xp\first@of@three\tmp@sizes}\maybe@load@font
  89.          \edef\cs@e{\global\textfont
  90.               \CSname{\F@style @fam}\CSname{\cs@a}}\cs@e
  91.     \edef\F@size{\xp\second@of@three\tmp@sizes}\maybe@load@font
  92.          \edef\cs@e{\global\scriptfont
  93.               \CSname{\F@style @fam}\CSname{\cs@a}}\cs@e
  94.     \edef\F@size{\xp\third@of@three\tmp@sizes}\maybe@load@font
  95.          \edef\cs@e{\global\scriptscriptfont
  96.               \CSname{\F@style @fam}\CSname{\cs@a}}\cs@e
  97.     \endgroup\fi
  98.     \csarg\fam{\F@style @fam}}
  99. \newfam\roman@fam  \def\roman@face@size{{foo}{bar}}
  100. \newfam\italic@fam \def\italic@face@size{{foo}{bar}}
  101. \newfam\bold@fam   \def\bold@face@size{{foo}{bar}}
  102. \newfam\tty@fam    \def\tty@face@size{{foo}{bar}}
  103. \def\ifface@size@changed{\iftrue}
  104. \def\temporarily@out@of@order
  105.    {\edef\cs@a{\csn\F@style @face@size\ecs}
  106.     \if\EqualString{\F@name}{\xp\take@former\cs@a}
  107.        \if\EqualString{\F@size}{\xp\take@latter\cs@a}
  108.              \csn iffalse\xp\xp\xp\ecs
  109.        \else \Tmessage[font]{Loading family <\F@style>}
  110.              \csarg\edef{\F@style @face@size}%
  111.                 {{\F@name}{\F@size}}
  112.              \csn iftrue\xp\xp\xp\ecs\fi
  113.     \else \Tmessage[font]{Loading family <\F@style>}
  114.           \csarg\edef{\F@style @face@size}%
  115.                 {{\F@name}{\F@size}}
  116.           \csn iftrue\xp\ecs \fi}
  117. % Define relative sizes,
  118. % and install math fonts,
  119. % loading if necessary
  120. \def\@setsize#1#2#3{%
  121.     \def\normal{\def\F@size{#1}\SetFont}\relax
  122.     \def\script{\def\F@size{#2}\SetFont}\relax
  123.     \def\scriptscript{\def\F@size{#3}\SetFont}\relax
  124.     \def\style@sizes{#1,#2,#3 }}
  125. \newif\ifloading@math
  126. \def\math@setsize#1,#2,#3 {%
  127.     \SaveFont \loading@mathyes
  128.     \set@mathfont{#1}\textfont
  129.     \set@mathfont{#2}\scriptfont
  130.     \set@mathfont{#3}\scriptscriptfont
  131.     \RestoreFont \loading@mathno
  132.     }
  133. % these lines are in 'text.tex'
  134. %\everymath{\the\every@everymath}
  135. %\everydisplay{\the\every@everymath}
  136. %\every@everymath{\high@fam\count18\relax \xp\math@setsize\style@sizes}
  137. % Strut: .8\baselineskip+.2\baselineskip
  138. % note: struts should be locally defined!
  139. \def\make@strut{\tempdima=.8\baselineskip \tempdimb=.2\baselineskip
  140.     \edef\strut{\vrule height \the\tempdima width \z@
  141.                        depth \the\tempdimb \relax}}
  142. % Main Font
  143. % is the font that's current at the end of the style definition
  144. % this is switched to in the output routine (head/footline!)
  145. % and the user can use it too.
  146. % this does not take properly care of baselineskip and strut.
  147. % nor math fonts, come to think of it.
  148. \def\store@main@font
  149.    {\edef\MainFace{\def\nxp\F@name{\F@name}}
  150.     \SaveFont \let\MainFont\RestoreFont}
  151. \let\MainFont\relax %cs is used in output@setup, which may be called
  152.                     %from Lollipop.tex
  153. % Save and restore fonts
  154. \def\SaveFont
  155.    {\edef\RestoreFont{\def\nxp\F@name{\F@name}%
  156.          \def\nxp\F@size{\F@size}%
  157.          \def\nxp\F@style{\F@style}%
  158.          \nxp\SetFont
  159.          \baselineskip=\the\baselineskip\relax
  160.                   }
  161.     }
  162. \def\RestoreFont{\Wmessage{No `Savefont' has been given}}
  163. % Defined Fonts
  164. % rather limited, because not upscalable.
  165. \def\DefineFont:#1=#2,#3,#4 {\begingroup
  166.     \Typeface:#2 \PointSize:#3 \Style:#4 
  167.     \edef\cs@e{\global\let\CSname{#1}=\CSname{\current@font}}\cs@e
  168.     \endgroup}
  169. % Increase / decrease point size
  170. \def\PointSizeLarger{\if\NextChar[%]
  171.     \ps@plus{\ps@plus[1]}}
  172. \def\PointSizeSmaller{\if\NextChar[%]
  173.     \ps@minus{\ps@minus[1]}}
  174. \def\ps@plus[#1]{\let\save@F@size\F@size
  175.     \tempcounta\F@size\relax \advance\tempcounta#1\relax
  176.     \edef\F@size{\the\tempcounta}\SetFont
  177.     \let\F@size\save@F@size}
  178. \def\ps@minus[{\ps@plus[-%]
  179.     }%]
  180. % Baselineskip
  181. \def\BaselineSkip:#1 {\baselineskip\@ww{#1}\make@strut}
  182. \def\@ps@bls#1{ps@bls\romannumeral#1}
  183. \def\@@ps@bls#1{\tempcounta#1\relax\baselineskip\tempcounta pt
  184.     \baselineskip\bls@ps@ratio\baselineskip\relax}
  185. \def\BaselineSkipPointSizeRatio:#1 {\def\bls@ps@ratio{#1}}
  186. \BaselineSkipPointSizeRatio:1.2
  187. \def\PointSizeBaselineSkip:#1
  188.    {\edef\cs@e{\nxp\pointsize@baselineskip{\w@w{#1}}}\cs@e}%nxp?
  189. \def\pointsize@baselineskip#1{%also used in \PointSize
  190.     \if\UndefinedCS{\@ps@bls{#1}}\@@ps@bls{#1}%
  191.     \else \baselineskip\csname \@ps@bls{#1}\endcsname \fi
  192.     \make@strut}
  193. \def\SetPointSizeBaselineSkip:#1=#2 
  194.    {\edef\cs@e{\w@w{#1}}%
  195.     \csarg\edef{\@ps@bls\cs@e}{\w@w{#2}}}
  196. \def\exblssizes#1{\ifcase#1\z@ \or \z@ \or \z@ \or \z@ \or \z@
  197.     \or 6.1pt  %5
  198.     \or 7.3pt  %6
  199.     \or 8.5pt  %7
  200.     \or 9.7pt  %8
  201.     \or 11pt   %9
  202.     \or 12pt   %10
  203.     \or 13pt   %11
  204.     \or 14.5pt %12
  205.     \or 15.6pt %13 
  206.     \or 16.8pt %14
  207.     \or 18pt   %15
  208.     \or 19.2pt %16
  209.     \or 20.4pt %17
  210.     \or 21.6pt %18 
  211.     \or 22.8pt %19 
  212.     \or 24pt   %20
  213.     \else \ifnum#1=24 28pt \else
  214.           \ifnum#1=30 36pt \else
  215.           \ifnum#1=32 38pt \else
  216.           \ifnum#1=48 56pt \else
  217.           \z@  \Emessage{Unknown pointsize: #1}\fi\fi\fi\fi
  218.     \fi \normalbaselineskip\baselineskip} 
  219. %%%% Math Fonts
  220. % Math fonts are loaded through the \everymath and \everydisplay.
  221. % This means that they are undefined outside math.
  222. % Therefore, any load during the style definition is global.
  223. % Symbol and extension fonts don't change with type
  224. % Control sequences \m@.. are \let to 0 or 1 to indicate that
  225. %  math at a certain size has been loaded
  226. % The ten point extension font is special because it is used
  227. % for all smaller sizes
  228. \font\exx=cmex10
  229. % Size to external name conversion for math fonts
  230. \def\mi@size#1{\ifcase#1 \or \or \or \or \or 5\or 6\or 7\or 8\or
  231.     9\or 10\or 10 \sc@led \magstephalf \or 10 \sc@led \magstep1\or
  232.     \or 10 \sc@led \magstep2\or \or 10 \sc@led \magstep3\or
  233.     \or 10 \sc@led \magstep3\or \or 10 \sc@led \magstep4\fi}
  234. \let\sy@size=\mi@size \let\cm@size=\mi@size
  235. \def\ex@size#1{\ifnum#1<10 10 \else\mi@size{#1}\fi}
  236. % For a size, test if it has been loaded yet, if not do;
  237. % then install as given style
  238. \def\set@mathfont#1#2%% #1=size #2=\text/script/scriptscript style
  239.    {\if\UndefinedCS{m@\romannumeral#1}\begingroup
  240.      \Tmessage[font]{Loading math style \string#2 at #1pt}%\globaldefs\@ne
  241.      \load@mathfammember{cm}{MathIT}{mi}{#1}\mi@size{'177}\relax
  242.      \load@mathfammember{cm}{MathSY}{sy}{#1}\sy@size{'060}\relax
  243.      \load@mathfammember{cm}{MathRM} {r}{#1}\cm@size{-1}\relax
  244.      \ifnum#1>10 \load@mathfammember{cm}{MathEX}{ex}{#1}\ex@size{-1}\relax
  245.      \else \global\csarg\let{MathEX\romannumeral#1}\exx
  246.      \fi
  247.      \global\csarg\let{m@\romannumeral#1}1\relax
  248.     \endgroup\fi
  249.     \if\UndefinedCS{\F@name VMI\romannumeral#1}\begingroup
  250.      \def\F@size{#1}\def\F@style{mitalic}%
  251.      \load@mathfammember{\cs@face@tag}
  252.             {\F@name VMI}{\ext@style}{#1}
  253.             {\ext@size\take@one}{-1}\relax
  254.     \endgroup\fi
  255.     \def\F@size{#1}\SetFont #20\the\font
  256.     #21 \csname MathIT\romannumeral#1\endcsname
  257.     #22 \csname MathSY\romannumeral#1\endcsname
  258.     #23 \csname MathEX\romannumeral#1\endcsname
  259.     #2\Kgriek \csname MathRM\romannumeral#1\endcsname
  260.     #2\VMIfam \csname \F@name VMI\romannumeral#1\endcsname}
  261. \def\load@mathfammember
  262.     #1#2#3#4#5#6%
  263.         %% #1=root of external name #2=internal tag
  264.         %% #3=external tag #4=size #5=size convertor #6=skew character
  265.    {\Tmessage[font]{Loading font (math)
  266.                 \csname#2\romannumeral#4\endcsname=#1#3#5{#4}}%
  267.     \global\xp\font\csname#2\romannumeral#4\endcsname=
  268.         #1#3#5{#4}\relax
  269.     \global\xp\skewchar\csname#2\romannumeral#4\endcsname=#6\relax
  270. % Allocate a family for cmr, which has Greek capitals
  271. \storecat"    
  272. \ifini{\newfam\Kgriek}
  273. \mathchardef\Gamma="0\hexdigit\Kgriek 00
  274. \mathchardef\Delta="0\hexdigit\Kgriek 01
  275. \mathchardef\Theta="0\hexdigit\Kgriek 02
  276. \mathchardef\Lambda="0\hexdigit\Kgriek 03
  277. \mathchardef\Xi="0\hexdigit\Kgriek 04
  278. \mathchardef\Pi="0\hexdigit\Kgriek 05
  279. \mathchardef\Sigma="0\hexdigit\Kgriek 06
  280. \mathchardef\Upsilon="0\hexdigit\Kgriek 07
  281. \mathchardef\Phi="0\hexdigit\Kgriek 08
  282. \mathchardef\Psi="0\hexdigit\Kgriek 09
  283. \mathchardef\Omega="0\hexdigit\Kgriek 0A
  284. % Math italic variables have to be from the current typeface
  285. % maybe this should be switchable
  286. \def\loop@redef@until#1{
  287. \loop \mathcode\tempcountb\tempcountc
  288.       \advance\tempcountb\@ne 
  289.       \advance\tempcountc\@ne 
  290.       \ifnum\tempcountb>#1\relax\else \repeat}
  291. \ifini{
  292. \newfam\VMIfam 
  293. \tempcounta=-"100 \advance\tempcounta"\hexdigit\VMIfam00
  294. \tempcountb=`a \tempcountc=\mathcode`a
  295. \advance\tempcountc\tempcounta
  296. \loop@redef@until{`z}
  297. \tempcountb=`A \tempcountc=\mathcode`A
  298. \advance\tempcountc\tempcounta
  299. \loop@redef@until{`Z}
  300. \restorecat"
  301. \def\cal{\fam2}
  302. % Typewriter is a bit of a problem
  303.  \font\ttix=cmtt9
  304.  \font\ttx=cmtt10 \font\ttxi=cmtt10 \sc@led \magstephalf
  305.  \font\ttxii=cmtt10 \sc@led \magstep1
  306.  \font\ttxiv=cmtt10 \sc@led \magstep2
  307.  \font\ttxvii=cmtt10 \sc@led \magstep3
  308.  \font\ttxx=cmtt10 \sc@led \magstep4
  309. \def\tt{\Typeface:ComputerModern \Style:tty }
  310. \def\terugstreep{{\tt \char`\\}}
  311. % Typeface Definition
  312. % \DefineTypeface{Naam}{rump}{style:exts}{size:exts}{combo:exts}
  313. % after this \Typeface:Naam can be used
  314. % the rump and the extension construct the external file names
  315. \def\DefineTypeface#1#2#3#4{\csarg\def{#1@code}{#2}
  316.     \csarg\def{#1@styles}{#3 }
  317.     \csarg\def{#1@sizes}{#4 }
  318.     \if\NextChar[%]
  319.         {\DefineTypeface@combos{#1}}{\DefineTypeface@combos{#1}[]}}
  320. \def\DefineTypeface@combos#1[#2]{\csarg\def{#1@combos}{#2}}
  321. \def\style@selector{\mswitch \xp\if\xp\EqualStringX\xp{\F@style} in: }
  322. \def\a@style@selector#1{\mswitch \xp\if\xp\EqualStringX\xp{#1} in: }
  323. \def\size@selector{\fswitch {\ifnum\F@size} in: }
  324. \def\a@size@selector#1{\fswitch {\ifnum#1} in: }
  325. \def\ext@combo{\csname\F@name @combos\endcsname}
  326. \def\ext@style{\xp\xp\xp\style@selector
  327.                \csname\F@name @styles\endcsname\endswitch}
  328. \def\ext@size {\xp\xp\xp\size@selector
  329.                \csname\F@name @sizes\endcsname\endswitch}
  330. \def\ext@name{\csname\F@name @code\endcsname}
  331. %\noeol
  332. % good (?) old Computer Modern
  333. \DefineTypeface{ComputerModern}{cm}%
  334.     {roman:r; slant:sl; italic:ti; mitalic:mi; bold:bx; tty:tt;
  335.      default:r;}%
  336.     {<6:5; <7:6; <8:7; <9:8; <10:9; <11:10; <12:10 \sc@led\magstephalf;
  337.      <14:10 \sc@led\magstep1; <16:10 \sc@led\magstep2;
  338.      <20:10 \sc@led\magstep3; >19:10 \sc@led\magstep4;
  339.      default:10;}%
  340.     [\ifStyle:italic \ifnum\F@size<7 ti7\fi\fi
  341.      \ifStyle:tty \ifnum\F@size<8 tt8\fi\fi]
  342. \DefineTypeface{ComputerSans}{cmss}%
  343.     {roman:; italic:i; mitalic:i; bold:bx; demiboldcondensed:dc;
  344.      default:;}%
  345.     {<9:8; <10:9; <11:10; <12:10 \sc@led\magstephalf;
  346.      <14:10 \sc@led\magstep1; <16:10 \sc@led\magstep2;
  347.      <20:10 \sc@led\magstep3; >19:10 \sc@led\magstep4;
  348.      default:10;}%
  349.     [\ifStyle:bold \ifnum\F@size<10 bx10\fi\fi]
  350. % MonoType
  351. \DefineTypeface{MTGill}{MGilSan}
  352.  {roman:; italic:Ita; mitalic:Ita; bold:Bol; 
  353.   lite:Lig; litital:LigIta; default:;}
  354.  {default: at \F@size pt;}
  355. % Postscript
  356. \DefineTypeface{macTimes}{Times}
  357.     {roman:; italic:I; mitalic:I; bold:B; default:;}
  358.     {default: at \F@size pt;}
  359. \DefineTypeface{macHelvetica}{Helvetica}
  360.     {roman:; italic:I; mitalic:I; bold:B; default:;}
  361.     {default: at \F@size pt;}
  362. \DefineTypeface{macCourier}{cour}
  363.     {roman:; italic:i; mitalic:i; bold:b; default:;}
  364.     {default: at \F@size pt;}
  365. \DefineTypeface{unixTimes}{Times}
  366.     {roman:; italic:I; mitalic:I; bold:B; default:;}
  367.     {default: at \F@size pt;}
  368. \DefineTypeface{unixHelvetica}{Helvetica}
  369.     {roman:; italic:I; mitalic:I; bold:B; default:;}
  370.     {default: at \F@size pt;}
  371. \DefineTypeface{unixCourier}{cour}
  372.     {roman:; italic:i; mitalic:i; bold:b; default:;}
  373.     {default: at \F@size pt;}
  374. \endinput
  375. 92/11/05 math family setting
  376.